<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //  let p1 = new Promise((resolve,reject) =>{
        //     resolve(1);
        // })

        //1.  then方法 每次都会返回一个新的promise对象
        // 2. promise 状态 state   结果result
        // 3. then方法  会把回调函数（onfulfilled 或者 onrejected）的返回值包装成promise对象返回
        //      如果onfulfilled 或者 onrejected的返回值不是promise实例，
        // then返回的promise对象的result就是onfulfilled 或者 onrejected的返回值， 状态就是fulfilled
        // p1.then(data =>{
        //     console.log("正确");
        // }).then(() =>{

        // }).then(() =>{

        // })

        //方法1
        // let p2 = p1.then((data) =>{
        //     console.log();
        //     return 2;//值为2
        // })
        // p2.then(result =>{
        //     console.log(result);//2
        // })

        // 方法2
        // let p2 = p1.then((data) =>{
        //     console.log();  
        //     return 2;//值为2
        // }).then(result =>{
        //     console.log(result);//2
        // })
        // console.log(p2);


        // 如果onfulfilled 或者 onrejected的返回值是promise实例A，
        // then返回的也是一个promise实例B， 且B的状态和结果 会跟着A走
        // let p3 = new Promise((resolve,reject) =>{
        //     resolve(1);
        // })

        // let p4 = p3.then(data =>{
        //     return new Promise((resolve,reject) =>{
        //         setTimeout(() =>{
        //             // resolve(2);
        //             reject(2);
        //         },2000)
        //     })
        // })

        // console.log(p4);


        // 如果我们多个异步任务 存在着依赖关系，利用promise的链式调用的语法来实现
        // 小明 花2秒下楼  花3秒去超市 花1秒买铅笔 花2秒回家

        // let p5 = new Promise((resolve,reject) =>{
        //     setTimeout(() =>{
        //         resolve("小明花2秒下楼了");
        //     },2000)
        // })

        // p5.then(result =>{
        //     return new Promise((resolve,reject) =>{
        //         console.log(result);
        //         setTimeout(() =>{
        //             resolve("花3秒去了超市")
        //         },3000)
        //     })
        // }).then(result =>{
        //     return new Promise((resolve,reject) =>{
        //         console.log(result);
        //         setTimeout(() =>{
        //             resolve("花1秒买铅笔")
        //         },1000)
        //     })
        // }).then(result =>{
        //         console.log(result);
        //         setTimeout(() =>{
        //             console.log("花2秒回家");
        //         },1000)
        //     })



        // then的链式调用的最后  写一个catch语句 用来捕获链式调用中的异常
         let p6 = new Promise((resolve,reject) =>{
            setTimeout(() =>{
                resolve("小明花2秒下楼了");
            },2000)
        })

        p6.then(result =>{
            return new Promise((resolve,reject) =>{
                console.log(result);
                setTimeout(() =>{
                    resolve("花3秒去了超市")
                    // reject("去医院了");
                },3000)
            })
        }).then(result =>{
            return new Promise((resolve,reject) =>{
                console.log(result);
                setTimeout(() =>{
                    resolve("花1秒买铅笔")
                },1000)
            })
        }).then(result =>{
                console.log(result);
                setTimeout(() =>{
                    console.log("花2秒回家");
                },1000)
        }).catch(error =>{    // catch 本质上就是then   等同 then(undefinde, (error) => {})
            return new Promise((resolve,reject) =>{
                console.log(error);
                setTimeout(() =>{
                        resolve("3秒后挂到了号");
                    },3000)
                })
            }).then((result) =>{
                console.log(result);
            })







    </script>
</body>
</html>